""""""
"""
Python爬取猫咪数据并做数据可视化图

爬虫部分使用模块：
	csv
	requests >>> pip install requests
	parsel >>> pip install parsel

数据可视化使用模块：
	pyecharts >>> pip install pyecharts
	pandas >>> pip install pandas

爬虫部分:
一. 确定目标需求,分析我们的需要数据来源 (对于网站进行抓包分析)
        目标网址: 猫咪交易网数据
        抓包分析 查找数据 需要使用开发者工具(鼠标右键点击检查或者F12)
        通过简单的分析之后,可以发现我们想要的数据内容来自 详情页网页源代码 http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_408658.html
        
    
    二. 代码实现过程
        1. 发送请求
            对于猫咪的列表页 发送请求
        2. 获取数据
            获取网页源代码/ 获取网页文本数据 response.text
        3. 解析数据
            提取数据内容 获取猫咪详情页/地区
        4. 发送请求
            对于猫咪的详情页url发送请求
        5. 获取数据/解析数据
            获取网页源代码/ 获取网页文本数据 response.text
            图片 / 音频 / 视频 / 特定格式文件 response.content 获取二进制数据
            提取我们想要的内容
        6. 保存数据
            保存csv表格数据
jupyter notebook

"""
import requests  # 发送请求模块, 第三方模块 pip install requests  selenium
import parsel  # 数据解析模块, 第三方模块 pip install parsel
import csv

"""
模块的安装:
    1.win + R 输入cmd 确定 >>> 输入安装命令 pip install 模块名 / pip install requests
    2.在pycharm里面 点击 Terminal 输入安装命令 pip install 模块名 / pip install requests

安装失败的原因:
    1. pip 不是内部命令
        原因是: 你python环境变量没有设置好
    2. 安装到一半出现报错
        原因是: 可能是read time out 网络连接超时  你可以切换成国内的镜像源安装
    3. 你在cmd中安装成功之后,但是在pycharm不能用
        可能你安装了多个python版本
        导致你pycharm里面的python解释器没有设置好
    4. 可能要更新一下 pip 
    
"""
f = open('data.csv', mode='a', encoding='utf8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['地区', '店名', '标题', '价格', '浏览次数', '卖家承诺', '在售只数',
                                           '年龄', '品种', '预防', '联系人', '联系方式', '异地运费', '是否纯种',
                                           '猫咪性别', '驱虫情况', '能否视频', '详情页'])

csv_writer.writeheader()  # 写入表头
for page in range(1, 21):
    print(f'=============================正在爬取第{page}页数据内容=============================')
    url = f'http://www.maomijiaoyi.com/index.php?/chanpinliebiao_c_2_{page}--24.html'
    # headers 请求头:  模拟浏览器对服务器发送请求 (把python代码伪装浏览器对服务器发送请求)
    # 服务器会返回一个响应数据 response
    # headers 从那里找 >>> 开发者工具里面找
    # headers 是字典形式  键值对
    # User-Agen 浏览器的基本信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
    }
    response = requests.get(url=url, headers=headers)
    # response对象   状态码 200 请求成功
    # 获取网页(响应体)文本数据
    # print(response.text)
    # 解析数据 正则表达式/css选择器/xpath (bs4/parsel)
    # 1. 需要把获取到的 html字符串数据(response.text) 转成 selector 对象 才能调parsel里面的一些方法
    selector = parsel.Selector(response.text)
    # css选择器 主要是根据标签属性内容提取数据
    href = selector.css('div.content:nth-child(1) a::attr(href)').getall()
    areas = selector.css('div.content:nth-child(1) .area .color_333::text').getall()
    # 列表推导式
    areas = [i.strip() for i in areas]
    for index in zip(href, areas):
        index_url = 'http://www.maomijiaoyi.com' + index[0]
        area = index[1]
        response_1 = requests.get(url=index_url, headers=headers)
        selector_1 = parsel.Selector(response_1.text)
        # 标题
        title = selector_1.css('.detail_text div.title::text').get().strip()
        shop = selector_1.css('.dinming::text').get().strip()  # 店名
        price = selector_1.css('.info1 div:nth-child(1) span.red.size_24::text').get()  # 价格
        views = selector_1.css('.info1 div:nth-child(1) span:nth-child(4)::text').get()  # 浏览次数
        promise = selector_1.css('.info1 div:nth-child(2) span::text').get().replace('卖家承诺: ', '')  # 浏览次数
        num = selector_1.css('.info2 div:nth-child(1) div.red::text').get()  # 在售只数
        age = selector_1.css('.info2 div:nth-child(2) div.red::text').get()  # 年龄
        kind = selector_1.css('.info2 div:nth-child(3) div.red::text').get()  # 品种
        prevention = selector_1.css('.info2 div:nth-child(4) div.red::text').get()  # 预防
        person = selector_1.css('div.detail_text .user_info div:nth-child(1) .c333::text').get()  # 联系人
        phone = selector_1.css('div.detail_text .user_info div:nth-child(2) .c333::text').get()  # 联系方式
        postage = selector_1.css('div.detail_text .user_info div:nth-child(3) .c333::text').get().strip()  # 包邮
        purebred = selector_1.css(
            '.xinxi_neirong div:nth-child(1) .item_neirong div:nth-child(1) .c333::text').get().strip()  # 是否纯种
        sex = selector_1.css(
            '.xinxi_neirong div:nth-child(1) .item_neirong div:nth-child(4) .c333::text').get().strip()  # 猫咪性别
        video = selector_1.css(
            '.xinxi_neirong div:nth-child(2) .item_neirong div:nth-child(4) .c333::text').get().strip()  # 能否视频
        worming = selector_1.css(
            '.xinxi_neirong div:nth-child(2) .item_neirong div:nth-child(2) .c333::text').get().strip()  # 是否驱虫
        dit = {
            '地区': area,
            '店名': shop,
            '标题': title,
            '价格': price,
            '浏览次数': views,
            '卖家承诺': promise,
            '在售只数': num,
            '年龄': age,
            '品种': kind,
            '预防': prevention,
            '联系人': person,
            '联系方式': phone,
            '异地运费': postage,
            '是否纯种': purebred,
            '猫咪性别': sex,
            '驱虫情况': worming,
            '能否视频': video,
            '详情页': index_url,
        }
        csv_writer.writerow(dit)
        print(title, area, shop, price, views, promise, num, age,
              kind, prevention, person, phone, postage, purebred,
              sex, video, worming, index_url, sep=' | ')
